home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / CBGRX103.ZIP / contrib / libgrx / drivers / cirrus54.asm < prev    next >
Assembly Source File  |  1993-12-06  |  12KB  |  380 lines

  1. ;--------------------------------------------------------------------------
  2. ; This is file CIRRUS54.ASM
  3. ;
  4. ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  5. ; Copyright (C) 1992 Csaba Biegl, 820 Stirrup Dr, Nashville, TN 37221
  6. ; Copyright (C) 1993 Hartmut Schirmer, Feldstr. 118, 2300 Kiel 1, Germany
  7. ;
  8. ; This file is distributed under the terms listed in the document
  9. ; "copying.dj", available from DJ Delorie at the address above.
  10. ; A copy of "copying.dj" should accompany this file; if not, a copy
  11. ; should be available from where this file was obtained.  This file
  12. ; may not be distributed without a verbatim copy of "copying.dj".
  13. ;
  14. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  15. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  16. ;--------------------------------------------------------------------------
  17. ;
  18. ; This driver supports Cirrus CL-GD542X Chipsets
  19. ; Check your BIOS documentation if all of below modes are supported !
  20. ;
  21. include grdriver.inc
  22. cseg    segment byte public 'code'
  23.     assume  cs:cseg, ds:cseg, es:cseg, ss:nothing
  24.  
  25.  
  26. ;--------------------------------------------------------------------------
  27. ; DRIVER HEADER
  28. ;  The following entries MUST match the structure and constant
  29. ;  declarations in the file 'grdriver.h' of the GRX graphics library
  30. ;  The mode word should contain the following bitfields:
  31. ;     - the GRD_NEW_DRIVER bit set for any new format driver
  32. ;     - the adapter type field should be specified
  33. ;     - the memory size field should be specified
  34. ;     - the paging mode field should be specified
  35. ;  The mode set routine will OR in the plane bitfield as it will
  36. ;  change when different color number modes are requested.
  37. ;--------------------------------------------------------------------------
  38.  
  39.     dw    offset mode_set_routine
  40.     dw    offset paging_routine
  41. mode_W  dw    GRD_NEW_DRIVER+GRD_VGA+GRD_1024K+GRD_NO_RW
  42. ;
  43. ; The 'def_xx' fields are filled in by go32 from the corresponding
  44. ; fields of the 'GO32' environment variable
  45. ;
  46. def_tw  dw    80        ; text width
  47. def_th  dw    25        ; text height
  48. def_gw  dw    640        ; graphics width
  49. def_gh  dw    480        ; graphics height
  50. def_nc  dw    16        ; graphics colors
  51.     dw    offset driver_init_routine
  52.     dw    offset text_mode_table
  53.     dw    offset graphics_mode_table
  54.  
  55. ;
  56. ; Biggest text and graphics sizes
  57. ;
  58. Max_TW  equ    132
  59. Max_TH  equ    50
  60. Max_GWn equ    800        ; non interlaced!!!
  61. Max_GHn equ    600
  62. Max_GW  equ    1024        ; may be interlaced
  63. Max_GH  equ    768
  64.  
  65.  
  66. ;--------------------------------------------------------------------------
  67. ; TABLE OF SUPPORTED TEXT MODES
  68. ;    - keep sorted by size
  69. ;    - end with an all 0 entry
  70. ;    - BIOS field = 0xff disables it
  71. ;    - fields:
  72. ;        width,  height, colors, BIOS#+  setup_procedure_index*256
  73. ;--------------------------------------------------------------------------
  74. text_mode_table        label word
  75.     dw    80,    25,    2,    007h +  00000h
  76.     dw    40,    25,    16,    001h +  00000h
  77.     dw    80,    25,    16,    003h +  00000h
  78.     dw    80,    50,    16,    003h +  00100h
  79.     dw    132,    25,    16,    014h +  00000h
  80.     dw    132,    43,    16,    054h +  00000h
  81.     dw    0,    0,    0,    000h +  00000h
  82.  
  83.  
  84. ;--------------------------------------------------------------------------
  85. ; TABLE OF SUPPORTED GRAPHICS MODES
  86. ;    - keep sorted first by colors then by size
  87. ;    - end with an all 0 entry
  88. ;    - BIOS field = 0xff disables it
  89. ;    - fields:
  90. ;        width,  height, colors, BIOS#+  setup_procedure_index*256
  91. ;--------------------------------------------------------------------------
  92. graphics_mode_table    label word
  93.     dw    320,    200,    16,    00dh +  00000h
  94.     dw    640,    200,    16,    00eh +  00000h
  95.     dw    640,    350,    16,    010h +  00000h
  96.     dw    640,    480,    16,    012h +  00000h
  97.     dw    800,    600,    16,    058h +  00000h
  98.     dw    1024,    768,    16,    05dh +  00000h
  99.     dw    320,    200,    256,    013h +  00000h
  100.     dw    640,    480,    256,    05fh +  00000h
  101.     dw    800,    600,    256,    05ch +  00000h
  102.     dw    1024,    768,    256,    060h +  00000h
  103.     dw    640,    480,  32768,    066h +  00000h
  104.     dw    800,    600,  32768,    067h +  00000h
  105.     dw    0,      0,      0,    000h +  00000h
  106.  
  107.  
  108. ;--------------------------------------------------------------------------
  109. ; TABLE OF SPECIAL SETUP PROCEDURES
  110. ;  You may need such procedures for:
  111. ;     -- reloading fonts on standard EGA or VGA for
  112. ;     higher resolution text modes
  113. ;     -- enable HiColor mode of some Super VGAs
  114. ;     -- Handle the parameter passing conventions of the VESA BIOS
  115. ;     -- put VGA into 256 color plane mode ("MODE X")
  116. ;     -- etc...
  117. ;  There should be one entry in the table for every non-zero
  118. ;  'setup_procedure_index' in the text and graphics mode tables.
  119. ;  The first entry in the table belongs to index 100h, and so on.
  120. ;  The special setup procedure is invoked via a near call.
  121. ;
  122. ;  Entry: DI=address of the mode record from the text or graphics
  123. ;      table to set up.
  124. ;
  125. ;  Exit:  Adapter configured
  126. ;      BX=driver mode word as it should be returned by the mode set
  127. ;         routine. Typically it involves picking up the mode word
  128. ;         from the header and OR-ing in the appropriate bitplane mode
  129. ;         bitfield. (This is not needed for text modes)
  130. ;      AX, CX, DX, SI can be trashed, PRESERVE DI!!!!
  131. ;
  132. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  133. ;--------------------------------------------------------------------------
  134. special_setup_table    label word
  135.     dw    offset  VGA_50row_mode_set
  136.  
  137. ;
  138. ; Routine to set up VGA 50 row mode
  139. ; interface is described above
  140. ;
  141. VGA_50row_mode_set    proc    near
  142.     mov    ax,03h            ; set 80x25 mode
  143.     int    10h
  144.     xor    bx,bx
  145.     mov    ax,1112h        ; load 8x8 font
  146.     int    10h
  147.     ret
  148. VGA_50row_mode_set    endp
  149.  
  150.  
  151. ;--------------------------------------------------------------------------
  152. ; DRIVER INIT ROUTINE
  153. ;  called once after the driver is loaded
  154. ;  may do one or more of the followings:
  155. ;    - check for proper board type
  156. ;    - check amount of RAM on board, and:
  157. ;    -- update word in header to reflect correct amount
  158. ;    -- disable modes in the tables for which there is not enough RAM
  159. ;    - check for special equipment (HiColor DAC, etc...)
  160. ;
  161. ;  Entry: nothing
  162. ;
  163. ;  Exit:  AX=status:
  164. ;       non-zero: OK,
  165. ;       0: something went wrong (e.g. wrong adapter, etc..)
  166. ;      BX,CX,DX may be trashed
  167. ;
  168. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  169. ;--------------------------------------------------------------------------
  170. driver_init_routine    proc    far
  171.     mov    ax,1            ; Really primitive, but works
  172.     ret                ; Make sure you've an GD542X Chip !
  173. driver_init_routine    endp
  174.  
  175.  
  176. ;--------------------------------------------------------------------------
  177. ; MODE SET ROUTINE
  178. ;  sets up a text or graphics mode as close as possible to the one
  179. ;  reguested by the user with regard to number of colors and size.
  180. ;
  181. ;  Entry: AX=mode selection
  182. ;     0 = 80x25 text
  183. ;     1 = default text
  184. ;     2 = text CX cols by DX rows
  185. ;     3 = biggest text
  186. ;     4 = 320x200 graphics
  187. ;     5 = default graphics
  188. ;     6 = graphics CX width by DX height
  189. ;     7 = biggest non-interlaced graphics
  190. ;     8 = biggest graphics
  191. ;     9 = graphics BX colors, CX width by DX height
  192. ;
  193. ;  Exit: BX=driver mode flag
  194. ;     CX=width (in pixels or characters)
  195. ;     DX=height
  196. ;
  197. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  198. ;     YOU SHOULD NOT NEED TO CHANGE THIS ROUTINE AS IT IS PRETTY
  199. ;     MUCH TABLE DRIVEN
  200. ;--------------------------------------------------------------------------
  201. mode_set_routine    proc    far
  202.     push    ds
  203.     push    di
  204.     push    si
  205.     mov    si,cs
  206.     mov    ds,si
  207.     cmp    ax,9
  208.     jbe    DoIt
  209.     jmp    Exit
  210. DoIt:    add    ax,ax
  211.     mov    si,ax
  212.     jmp    WORD PTR mode_set_table[si]
  213. mode_set_table  label    word
  214.     dw    offset mode_0
  215.     dw    offset mode_1
  216.     dw    offset mode_2
  217.     dw    offset mode_3
  218.     dw    offset mode_4
  219.     dw    offset mode_5
  220.     dw    offset mode_6
  221.     dw    offset mode_7
  222.     dw    offset mode_8
  223.     dw    offset mode_9
  224. mode_0: mov    si,offset text_mode_table    ; 80x25 text
  225.     mov    bx,def_nc
  226.     mov    cx,80
  227.     mov    dx,25
  228.     jmp    Lookup
  229. mode_1: mov    si,offset text_mode_table    ; default text
  230.     mov    bx,def_nc
  231.     mov    cx,def_tw
  232.     mov    dx,def_th
  233.     jmp    Lookup
  234. mode_2: mov    si,offset text_mode_table    ; CX*DX text
  235.     mov    bx,def_nc
  236.     jmp    Lookup
  237. mode_3: mov    si,offset text_mode_table    ; biggest text
  238.     mov    bx,def_nc
  239.     mov    cx,Max_TW
  240.     mov    dx,Max_TH
  241.     jmp    Lookup
  242. mode_4: mov    si,offset graphics_mode_table    ; 320x200 graphics
  243.     mov    bx,def_nc
  244.     mov    cx,320
  245.     mov    dx,200
  246.     jmp    Lookup
  247. mode_5: mov    si,offset graphics_mode_table    ; default graphics
  248.     mov    bx,def_nc
  249.     mov    cx,def_gw
  250.     mov    dx,def_gh
  251.     jmp    Lookup
  252. mode_6: mov    si,offset graphics_mode_table    ; CX*DX graphics
  253.     mov    bx,def_nc
  254.     jmp    Lookup
  255. mode_7: mov    si,offset graphics_mode_table    ; biggest non-interlaced gr
  256.     mov    bx,def_nc
  257.     mov    cx,Max_GWn
  258.     mov    dx,Max_GHn
  259.     jmp    Lookup
  260. mode_8: mov    si,offset graphics_mode_table    ; biggest graphics
  261.     mov    bx,def_nc
  262.     mov    cx,Max_GW
  263.     mov    dx,Max_GH
  264.     jmp    Lookup
  265. mode_9: mov    si,offset graphics_mode_table    ; CX*DX graphics w/ BX colors
  266. ;
  267. ; At this point:
  268. ;   SI points to the table to search (text or graphics)
  269. ;   BX has colors
  270. ;   CX has width
  271. ;   DX has height
  272. ;
  273. Lookup: xor    ax,ax                ; last color number seen
  274. Find_C: cmp    [si+4],ax            ; last color number == this?
  275.     je    Same_C
  276.     jb    Prev_C                ; end of table -- use last color
  277.     cmp    BYTE PTR [si+6],0ffh        ; valid entry ?
  278.     je    Prev_C                ; not -- use last color
  279.     mov    ax,[si+4]            ; record color number
  280.     mov    di,si                ; start of entries w/ this color
  281.     cmp    ax,bx                ; enough colors ?
  282.     jae    Find_S
  283. Same_C: add    si,8
  284.     jmp    Find_C
  285. Prev_C: or    ax,ax                ; found any color at all?
  286.     je    Exit
  287. ;
  288. ; At this point:
  289. ;   DI points into the table to the first entry with the desired color
  290. ;      number (either it has enough colors or it is the highest color
  291. ;      number supported by the driver). Additionally, at least the
  292. ;      first (= smallest size) entry for this color is valid (has a
  293. ;      valid BIOS number).
  294. ;   AX has the color number adjusted for the driver
  295. ;   CX has width
  296. ;   DX has height
  297. ;
  298. Find_S: cmp    [di+4],ax            ; still the same color #?
  299.     jne    Prev_S
  300.     cmp    BYTE PTR [di+6],0ffh        ; valid entry ?
  301.     je    Prev_S
  302.     cmp    [di],cx
  303.     jb    Next_S
  304.     cmp    [di+2],dx
  305.     jae    GotIt
  306. Next_S: add    di,8
  307.     jmp    Find_S
  308. Prev_S: sub    di,8
  309. ;
  310. ; At this point:
  311. ;   DI points to the table entry we want to set up
  312. ;
  313. GotIt:  mov    ax,[di+6]            ; BIOS mode number
  314.     or    ah,ah                ; special ?
  315.     je    doBIOS
  316.     mov    al,ah
  317.     xor    ah,ah
  318.     dec    ax
  319.     add    ax,ax
  320.     mov    si,ax
  321.     call    WORD PTR special_setup_table[si]
  322.     jmp    RetVal
  323. doBIOS: int    10h
  324.     mov    bx,GRD_1_PLANE
  325.     cmp    WORD PTR [di+4],2        ; 2 colors ?
  326.     je    doFLAG
  327.     mov    bx,GRD_4_PLANES
  328.     cmp    WORD PTR [di+4],16        ; 16 colors ?
  329.     je    doFLAG
  330.     mov    bx,GRD_8_PLANES
  331.     cmp    WORD PTR [di+4],256        ; 256 colors ?
  332.     je    doFLAG
  333.     mov    bx,GRD_16_PLANES
  334.     cmp    WORD PTR [di+4],32768        ; 32K colors ?
  335.     je    doFLAG
  336.     mov    bx,GRD_PLANE_MASK        ; something is wrong!!
  337. doFLAG: or    bx,mode_W
  338. RetVal: mov    cx,[di]
  339.     mov    dx,[di+2]
  340. Exit:    pop    si
  341.     pop    di
  342.     pop    ds
  343.     ret
  344. mode_set_routine    endp
  345.  
  346.  
  347. ;--------------------------------------------------------------------------
  348. ; PAGING ROUTINE
  349. ;
  350. ;  Entry: AH=read page
  351. ;      AL=write page
  352. ;
  353. ;  Exit: VGA configured.
  354. ;     AX,BX,CX,DX,SI,DI may be trashed
  355. ;
  356. ;  NOTE: This runs in protected mode!  Don't mess with the segment registers!
  357. ;     This code must be relocatable and may not reference any data!
  358. ;--------------------------------------------------------------------------
  359.     assume  ds:nothing, es:nothing
  360.  
  361. paging_routine  proc    far
  362.     .286
  363.     shl    ah,4
  364.     mov    dx,03ceh
  365.     mov    al,9
  366.     out    dx,al
  367.     inc    dx
  368.     mov    al,ah
  369.     out    dx,al
  370.  
  371.     mov    al,8        ; reconfig GR CTRL port for mask writes
  372.     dec    dx
  373.     out    dx,al
  374.     ret
  375. paging_routine  endp
  376.  
  377.  
  378. cseg    ends
  379.     end
  380.